<template>
  <!-- 搜索顶部区域 -->
  <div class="searchTop">
    <van-icon name="revoke" size="25" @click="$router.go(-1)" />
    <van-search v-model.trim="musicName.searchKey" placeholder="鸡你太美" shape="round" @search="enterKey" />
  </div>
  <!-- 历史记录区域 -->
  <div class="searchHistory">
    <span class="searchSpan">历史</span>
    <van-tag round color="rgb(185, 169, 169)" text-color="#000000" size="large" v-for="item in musicName.keyWorldList" :key="item" @click="searchHistory(item)">{{item}}</van-tag>
    <van-icon class="icon" name="delete-o" size="20" @click="delHistory" />
  </div>
  <!-- 歌曲列表区域 -->
  <MusicList v-for="(item,i) in musicName.searchList" :key="item" @click="updateIndex(item)">
    <template #musicIndex>
      <span class="leftSpan">{{i+1}}</span>
    </template>
    <template #musicName>
      <div>
        <p>{{item.name}}</p>
        <span class="authorName" v-for="item1 in item.artists" :key="item1">{{item1.name}}</span>
      </div>
    </template>
    <template #mv>
      <div class="itemRight">
        <van-icon class="icon bofang" name="play" size="25" color="#999" v-if="item.mvid" />
        <van-icon class="icon liebiao" name="wap-nav" size="25" color="#999" />
      </div>
    </template>
  </MusicList>
</template>

<script>
import { reactive, onMounted } from 'vue'
import { getSearchMusic } from '@/api/search.js'
import MusicList from '@/components/musics/MusicList.vue'
import { mapMutations, mapState } from 'vuex'
// vue3中可以导入这个useStore，获得store对象，不需要利用this使用
import { useStore } from 'vuex'
export default {
  name: 'Search',
  components: {
    MusicList
  },
  computed: {
    // ...mapState(['playList'])
  },
  methods: {
    // 监听点击搜索出来的歌曲添加在播放列表的事件
    // updateIndex(item) {
    //   // 搜索请求的数据属性和请求推荐歌单列表的数据属性不一致，所以需要手动添加属性与请求推荐歌单列表的属性一致
    //   item.al = item.album
    //   item.al.picUrl = item.album.artist.img1v1Url
    //   item.ar = item.artists
    //   // 点击搜索的歌曲则添加在播放列表后面
    //   this.pushPlayList(item)
    //   // 点击搜索出来的歌曲索引添加在播放列表的索引数据里面
    //   this.updatePlayListIndex(this.playList.length - 1)
    // },
    // ...mapMutations(['pushPlayList', 'updatePlayListIndex'])
  },
  setup() {
    // vue3不能用this.$store,用store即可
    const store = useStore()
    // 定义搜索框、搜索记录、搜索列表的数据
    let musicName = reactive({ searchKey: '', keyWorldList: [], searchList: [] })
    // 监听搜索历史追加到数组进行渲染的事件
    async function enterKey() {
      // 当输入不是空格时才能追加搜索历史到数组里面
      if (musicName.searchKey) {
        musicName.keyWorldList.unshift(musicName.searchKey)
        // 历史记录去重
        musicName.keyWorldList = [...new Set(musicName.keyWorldList)]
        // 超出固定历史记录数则自动删除最后一个
        if (musicName.keyWorldList.length > 5) {
          musicName.keyWorldList.pop()
        }
        // 把搜索历史保存到本地，刷新界面时从本地拿数据渲染
        localStorage.setItem('keyWorldList', JSON.stringify(musicName.keyWorldList))
        // 请求后台获取搜索列表数据
        const { data: res } = await getSearchMusic(musicName.searchKey)
        console.log(res)
        if (res.code !== 200) {
          console.log('获取歌曲数据失败')
        }
        musicName.searchList = res.result.songs
        musicName.searchKey = ''
      }
    }
    // 界面每次刷新时从本地拿搜索记录数据渲染
    onMounted(() => {
      musicName.keyWorldList = JSON.parse(localStorage.getItem('keyWorldList')) ? JSON.parse(localStorage.getItem('keyWorldList')) : []
    })
    // 监听删除搜索历史事件
    function delHistory() {
      musicName.keyWorldList = []
      localStorage.removeItem('keyWorldList')
    }
    // 监听点击搜索记录图标请求歌曲数据事件,
    async function searchHistory(item) {
      // 请求后台获取搜索列表数据
      const { data: res } = await getSearchMusic(item)
      if (res.code !== 200) {
        console.log('获取歌曲数据失败')
      }
      musicName.searchList = res.result.songs
    }
    // 监听点击搜索出来的歌曲添加在播放列表的事件
    function updateIndex(item) {
      // 搜索请求的数据属性和请求推荐歌单列表的数据属性不一致，所以需要手动添加属性与请求推荐歌单列表的属性一致
      item.al = item.album
      item.al.picUrl = item.album.artist.img1v1Url
      item.ar = item.artists
      // 点击搜索的歌曲则添加在播放列表后面
      store.commit('pushPlayList', item)
      // 点击搜索出来的歌曲索引添加在播放列表的索引数据里面
      store.commit('updatePlayListIndex', store.state.playList.length - 1)
    }
    return { musicName, enterKey, delHistory, searchHistory, updateIndex }
  }
}
</script>

<style lang="less" scoped>
.searchTop {
  width: 100%;
  height: 0.8rem;
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 0.3rem;
  .van-search {
    width: 90%;
  }
}

.searchHistory {
  width: 100%;
  padding: 0.2rem;
  position: relative;
  .searchSpan {
    font-weight: 700;
  }
  .van-tag {
    display: inline-block;
    margin-left: 0.2rem;
  }
  .icon {
    position: absolute;
    right: 0.2rem;
    top: 0.25rem;
  }
}
.itemList {
  .leftSpan {
    display: inline-block;
    width: 0.2rem;
    text-align: center;
    color: #999;
  }
  div {
    p {
      width: 4.54rem;
      height: 0.4rem;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      font-weight: 700;
    }
    span {
      font-weight: 400;
      font-size: 0.24rem;
      color: #999;
    }
    .authorName {
      margin-right: 0.1rem;
    }
    margin-left: 0.3rem;
  }
  .itemRight {
    width: 20%;
    height: 100%;
    display: flex;
    // justify-content: space-between;
    align-items: center;
    position: relative;
    .bofang {
      position: absolute;
      left: 0;
    }
    .liebiao {
      position: absolute;
      right: 0;
    }
  }
}
</style>